package cn.itcast.scala.course08
import java.io.File
import ImplicitAspect._
/**
  * 隐士转换 -- scala其实就相当于java中的动态代理  对原有类进行增强
  * 经过切面的统一封装后，不需要在代码中定义implicit，统一导入即可
  * 该例子中的隐式转换重点掌握，其他隐式参数与隐式类不用掌握
  * create by zhangtian on 2019/1/9
  */
object ImplicitApp extends App {

  // 示例一 对普通man对象进行增强，使其可以fly
  // 定义隐式转化函数即可
  // implicit def man2Superman(man: Man) : Superman = new Superman(man.name)// 经过切面的统一封装后，不需要在代码中定义implicit，统一导入即可

  val man = new Man("PK")
  man.fly()

  // 示例二 测试增强包中的系统类File加入read方法
  println("********* 测试File ********")
 //  implicit def file2RichFile(file: File) : RichFile = new RichFile(file) 经过切面的统一封装后，不需要在代码中定义implicit，统一导入即可
  val txt = new File("D:\\Developer\\IDEAWorkspace\\LearningScala2.11.12\\scala-train\\src\\main\\scala\\cn\\itcast\\scala\\course07\\flatMap")
  println(txt.read())
}

class Man(val name: String) {
  def eat() = {
    println(s"man [ $name ] eating ......")
  }
}

class Superman(val name: String) {
  def fly() = {
    println(s"superman [ $name ] flying ......")
  }
}

class RichFile(val file: File) {
  def read(): String = {
    scala.io.Source.fromFile(file.getPath).mkString
  }
}
